﻿
using System;
using System.Collections;
using System.IO;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.СправочникиСсылка;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.СправочникиСсылка
{
	[ProtoContract]
	[DataContract]
	public partial class ЭДПрисоединенныеФайлы:СправочникСсылка,IСериализаторProtoBuf,IСериализаторJson
	{
		public static readonly Guid ГуидКласса = new Guid("e0923338-40d1-44a1-bd03-6b1662cb1b25");
		public static readonly DateTime ВерсияКласса = DateTime.ParseExact("20120928012028.000", new string[] {"yyyyMMddHHmmss.fff"}, CultureInfo.InvariantCulture, DateTimeStyles.None);
		public static readonly long КонтрольнаяСуммаКласса = 123;
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		public bool ПометкаУдаления {get;set;}
		public bool Предопределенный {get;set;}
		[DataMember(Name = "Представление")]//Проверить основное представление.
		[ProtoMember(3)]
		public string/*150*/ Наименование {get;set;}
		///<summary>
		///Автор - пользователь, добавивший файл
		///</summary>
		public V82.СправочникиСсылка.Пользователи Автор {get;set;}
		public V82.Перечисления/*Ссылка*/.ВидыЭД ВидЭД {get;set;}//Вид ЭД
		public object ВладелецФайла {get;set;}//Владелец файла
		public DateTime ДатаДокументаОтправителя {get;set;}//Дата документа отправителя
		public DateTime ДатаИзмененияСтатусаЭД {get;set;}//Дата изменения статуса ЭД
		public DateTime ДатаМодификацииУниверсальная {get;set;}//Дата модификации универсальная
		///<summary>
		///Дата добавления файла в базу
		///</summary>
		public DateTime ДатаСоздания {get;set;}//Дата создания
		public DateTime ДатаФормированияЭДОтправителем {get;set;}//Дата формирования ЭД отправителем
		public bool Загружен {get;set;}
		public bool Зашифрован {get;set;}
		///<summary>
		///Пользователь, изменивший файл
		///</summary>
		public V82.СправочникиСсылка.Пользователи Изменил {get;set;}
		///<summary>
		///Индекс иконки, соответствующей расширению файла, для показа в списке
		///</summary>
		public decimal/*(10)*/ ИндексКартинки {get;set;}//Индекс картинки
		public V82.СправочникиСсылка.Контрагенты Контрагент {get;set;}
		public V82.Перечисления/*Ссылка*/.НаправленияЭД НаправлениеЭД {get;set;}//Направление ЭД
		public decimal/*(3)*/ НомерВерсииЭД {get;set;}//Номер версии ЭД
		public string/*(30)*/ НомерДокументаОтправителя {get;set;}//Номер документа отправителя
		public string/*(150)*/ НомерЭД {get;set;}//Номер ЭД
		///<summary>
		///Описание файла
		///</summary>
		public string/*(0)*/ Описание {get;set;}
		public V82.СправочникиСсылка.Организации Организация {get;set;}
		public V82.СправочникиСсылка.Пользователи Ответственный {get;set;}
		public string/*(50)*/ ОтправительЭД {get;set;}//Отправитель ЭД
		public bool ПодписанЭЦП {get;set;}//Подписан ЭЦП
		public string/*(50)*/ ПолучательЭД {get;set;}//Получатель ЭД
		public string/*(0)*/ ПричинаОтклонения {get;set;}//Причина отклонения
		///<summary>
		///Дополнительный путь к файлу на диске (в случае, если "Тип хранения файла" - на диске)
		///</summary>
		public string/*(0)*/ ПутьКФайлу {get;set;}//Путь к файлу
		///<summary>
		///Размер файла
		///</summary>
		public decimal/*(10)*/ Размер {get;set;}
		///<summary>
		///Расширение файла версии
		///</summary>
		public string/*(10)*/ Расширение {get;set;}
		///<summary>
		///Пользователь, занявший файл для редактирования
		///</summary>
		public V82.СправочникиСсылка.Пользователи Редактирует {get;set;}
		public V82.СправочникиСсылка.СоглашенияОбИспользованииЭД СоглашениеЭД {get;set;}//Соглашение ЭД
		///<summary>
		///Статус извлечения текста - для фонового задания извлечения текста
		///</summary>
		public V82.Перечисления/*Ссылка*/.СтатусыИзвлеченияТекстаФайлов СтатусИзвлеченияТекста {get;set;}//Статус извлечения текста
		public V82.Перечисления/*Ссылка*/.СтатусыЭД СтатусЭД {get;set;}//Статус ЭД
		///<summary>
		///Текст, извлеченный из файла - для полнотекстового поиска
		///</summary>
		public ХранилищеЗначения ТекстХранилище {get;set;}//Текст
		///<summary>
		///Где хранятся файлы - в базе как ХранилищеЗначения или в каталоге на диске
		///</summary>
		public V82.Перечисления/*Ссылка*/.ТипыХраненияФайлов ТипХраненияФайла {get;set;}//Тип хранения файла
		public V82.Перечисления/*Ссылка*/.ТипыЭлементовВерсииЭД ТипЭлементаВерсииЭД {get;set;}//Тип элемента версии ЭД
		///<summary>
		///Ссылка на том (в случае, если "Тип хранения файла" - на диске)
		///</summary>
		public V82.СправочникиСсылка.ТомаХраненияФайлов Том {get;set;}
		public string/*(36)*/ УникальныйИД {get;set;}//Уникальный ИД
		///<summary>
		///Служебное поле для обмена файлами в РИБ
		///</summary>
		public ХранилищеЗначения ФайлХранилище {get;set;}//Файл хранилище
		public V82.СправочникиСсылка.ЭДПрисоединенныеФайлы ЭлектронныйДокументВладелец {get;set;}//Электронный документ владелец
		
		public ЭДПрисоединенныеФайлы()
		{
		}
		
		public ЭДПрисоединенныеФайлы(byte[] УникальныйИдентификатор)
			: this(УникальныйИдентификатор,0)
		{
		}
		
		public ЭДПрисоединенныеФайлы(byte[] УникальныйИдентификатор,int Глубина)
		{
			if (Глубина>3)
			{
				return;
			}
			if (new Guid(УникальныйИдентификатор) == Guid.Empty)
			{
				return;
			}
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Select top 1 
					_IDRRef [Ссылка]
					,_Version [Версия]
					,_Marked [ПометкаУдаления]
					,_IsMetadata [Предопределенный]
					,_Description [Наименование]
					,_Fld23920RRef [Автор]
					,_Fld23921RRef [ВидЭД]
					,_Fld23922_TYPE [ВладелецФайла_Тип],_Fld23922_RRRef [ВладелецФайла],_Fld23922_RTRef [ВладелецФайла_Вид]
					,_Fld23923 [ДатаДокументаОтправителя]
					,_Fld23924 [ДатаИзмененияСтатусаЭД]
					,_Fld23925 [ДатаМодификацииУниверсальная]
					,_Fld23926 [ДатаСоздания]
					,_Fld23927 [ДатаФормированияЭДОтправителем]
					,_Fld23928 [Загружен]
					,_Fld23929 [Зашифрован]
					,_Fld23930RRef [Изменил]
					,_Fld23931 [ИндексКартинки]
					,_Fld23932RRef [Контрагент]
					,_Fld23933RRef [НаправлениеЭД]
					,_Fld23934 [НомерВерсииЭД]
					,_Fld23935 [НомерДокументаОтправителя]
					,_Fld23936 [НомерЭД]
					,_Fld23937 [Описание]
					,_Fld23938RRef [Организация]
					,_Fld23939RRef [Ответственный]
					,_Fld23940 [ОтправительЭД]
					,_Fld23941 [ПодписанЭЦП]
					,_Fld23942 [ПолучательЭД]
					,_Fld23943 [ПричинаОтклонения]
					,_Fld23944 [ПутьКФайлу]
					,_Fld23945 [Размер]
					,_Fld23946 [Расширение]
					,_Fld23947RRef [Редактирует]
					,_Fld23948RRef [СоглашениеЭД]
					,_Fld23949RRef [СтатусИзвлеченияТекста]
					,_Fld23950RRef [СтатусЭД]
					,_Fld23951 [ТекстХранилище]
					,_Fld23952RRef [ТипХраненияФайла]
					,_Fld23953RRef [ТипЭлементаВерсииЭД]
					,_Fld23954RRef [Том]
					,_Fld23955 [УникальныйИД]
					,_Fld23956 [ФайлХранилище]
					,_Fld23957RRef [ЭлектронныйДокументВладелец]
					From _Reference23137(NOLOCK)
					Where _IDRRef=@УникальныйИдентификатор  ";
					Команда.Parameters.AddWithValue("УникальныйИдентификатор", УникальныйИдентификатор);
					using (var Читалка = Команда.ExecuteReader())
					{
						if (Читалка.Read())
						{
							//ToDo: Читать нужно через GetValues()
							Ссылка = new Guid((byte[])Читалка.GetValue(0));
							var ПотокВерсии = ((byte[])Читалка.GetValue(1));
							Array.Reverse(ПотокВерсии);
							Версия =  BitConverter.ToInt64(ПотокВерсии, 0);
							ВерсияДанных =  Convert.ToBase64String(ПотокВерсии);
							ПометкаУдаления = ((byte[])Читалка.GetValue(2))[0]==1;
							Предопределенный = ((byte[])Читалка.GetValue(3))[0]==1;
							Наименование = Читалка.GetString(4);
								Автор = new V82.СправочникиСсылка.Пользователи((byte[])Читалка.GetValue(5),Глубина+1);
								ВидЭД = V82.Перечисления/*Ссылка*/.ВидыЭД.ПустаяСсылка.Получить((byte[])Читалка.GetValue(6));
								ДатаДокументаОтправителя = Читалка.GetDateTime(10);
								ДатаИзмененияСтатусаЭД = Читалка.GetDateTime(11);
								ДатаМодификацииУниверсальная = Читалка.GetDateTime(12);
								ДатаСоздания = Читалка.GetDateTime(13);
								ДатаФормированияЭДОтправителем = Читалка.GetDateTime(14);
								Загружен = ((byte[])Читалка.GetValue(15))[0]==1;
								Зашифрован = ((byte[])Читалка.GetValue(16))[0]==1;
								Изменил = new V82.СправочникиСсылка.Пользователи((byte[])Читалка.GetValue(17),Глубина+1);
								ИндексКартинки = Читалка.GetDecimal(18);
								Контрагент = new V82.СправочникиСсылка.Контрагенты((byte[])Читалка.GetValue(19),Глубина+1);
								НаправлениеЭД = V82.Перечисления/*Ссылка*/.НаправленияЭД.ПустаяСсылка.Получить((byte[])Читалка.GetValue(20));
								НомерВерсииЭД = Читалка.GetDecimal(21);
								НомерДокументаОтправителя = Читалка.GetString(22);
								НомерЭД = Читалка.GetString(23);
								Описание = Читалка.GetString(24);
								Организация = new V82.СправочникиСсылка.Организации((byte[])Читалка.GetValue(25),Глубина+1);
								Ответственный = new V82.СправочникиСсылка.Пользователи((byte[])Читалка.GetValue(26),Глубина+1);
								ОтправительЭД = Читалка.GetString(27);
								ПодписанЭЦП = ((byte[])Читалка.GetValue(28))[0]==1;
								ПолучательЭД = Читалка.GetString(29);
								ПричинаОтклонения = Читалка.GetString(30);
								ПутьКФайлу = Читалка.GetString(31);
								Размер = Читалка.GetDecimal(32);
								Расширение = Читалка.GetString(33);
								Редактирует = new V82.СправочникиСсылка.Пользователи((byte[])Читалка.GetValue(34),Глубина+1);
								СоглашениеЭД = new V82.СправочникиСсылка.СоглашенияОбИспользованииЭД((byte[])Читалка.GetValue(35),Глубина+1);
								СтатусИзвлеченияТекста = V82.Перечисления/*Ссылка*/.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка.Получить((byte[])Читалка.GetValue(36));
								СтатусЭД = V82.Перечисления/*Ссылка*/.СтатусыЭД.ПустаяСсылка.Получить((byte[])Читалка.GetValue(37));
								ТипХраненияФайла = V82.Перечисления/*Ссылка*/.ТипыХраненияФайлов.ПустаяСсылка.Получить((byte[])Читалка.GetValue(39));
								ТипЭлементаВерсииЭД = V82.Перечисления/*Ссылка*/.ТипыЭлементовВерсииЭД.ПустаяСсылка.Получить((byte[])Читалка.GetValue(40));
								Том = new V82.СправочникиСсылка.ТомаХраненияФайлов((byte[])Читалка.GetValue(41),Глубина+1);
								УникальныйИД = Читалка.GetString(42);
								ЭлектронныйДокументВладелец = new V82.СправочникиСсылка.ЭДПрисоединенныеФайлы((byte[])Читалка.GetValue(44),Глубина+1);
							//return Ссылка;
						}
						else
						{
							//return null;
						}
					}
				}
			}
		}
		
		public V82.СправочникиОбъект.ЭДПрисоединенныеФайлы  ПолучитьОбъект()
		{
			var Объект = new V82.СправочникиОбъект.ЭДПрисоединенныеФайлы();
			Объект._ЭтоНовый = false;
			Объект.Ссылка = Ссылка;
			Объект.Версия = Версия;
			Объект.ПометкаУдаления = ПометкаУдаления;
			Объект.Предопределенный = Предопределенный;
			Объект.Наименование = Наименование;
			Объект.Автор = Автор;
			Объект.ВидЭД = ВидЭД;
			Объект.ВладелецФайла = ВладелецФайла;
			Объект.ДатаДокументаОтправителя = ДатаДокументаОтправителя;
			Объект.ДатаИзмененияСтатусаЭД = ДатаИзмененияСтатусаЭД;
			Объект.ДатаМодификацииУниверсальная = ДатаМодификацииУниверсальная;
			Объект.ДатаСоздания = ДатаСоздания;
			Объект.ДатаФормированияЭДОтправителем = ДатаФормированияЭДОтправителем;
			Объект.Загружен = Загружен;
			Объект.Зашифрован = Зашифрован;
			Объект.Изменил = Изменил;
			Объект.ИндексКартинки = ИндексКартинки;
			Объект.Контрагент = Контрагент;
			Объект.НаправлениеЭД = НаправлениеЭД;
			Объект.НомерВерсииЭД = НомерВерсииЭД;
			Объект.НомерДокументаОтправителя = НомерДокументаОтправителя;
			Объект.НомерЭД = НомерЭД;
			Объект.Описание = Описание;
			Объект.Организация = Организация;
			Объект.Ответственный = Ответственный;
			Объект.ОтправительЭД = ОтправительЭД;
			Объект.ПодписанЭЦП = ПодписанЭЦП;
			Объект.ПолучательЭД = ПолучательЭД;
			Объект.ПричинаОтклонения = ПричинаОтклонения;
			Объект.ПутьКФайлу = ПутьКФайлу;
			Объект.Размер = Размер;
			Объект.Расширение = Расширение;
			Объект.Редактирует = Редактирует;
			Объект.СоглашениеЭД = СоглашениеЭД;
			Объект.СтатусИзвлеченияТекста = СтатусИзвлеченияТекста;
			Объект.СтатусЭД = СтатусЭД;
			Объект.ТекстХранилище = ТекстХранилище;
			Объект.ТипХраненияФайла = ТипХраненияФайла;
			Объект.ТипЭлементаВерсииЭД = ТипЭлементаВерсииЭД;
			Объект.Том = Том;
			Объект.УникальныйИД = УникальныйИД;
			Объект.ФайлХранилище = ФайлХранилище;
			Объект.ЭлектронныйДокументВладелец = ЭлектронныйДокументВладелец;
			return Объект;
		}
		
		private static readonly Hashtable Кэш = new Hashtable(1000);
		
		public static V82.СправочникиСсылка.ЭДПрисоединенныеФайлы ВзятьИзКэша(byte[] УникальныйИдентификатор)
		{
			var УИ = new Guid(УникальныйИдентификатор);
			if (Кэш.ContainsKey(УИ))
			{
				return (V82.СправочникиСсылка.ЭДПрисоединенныеФайлы)Кэш[УИ];
			}
			var Ссылка = new V82.СправочникиСсылка.ЭДПрисоединенныеФайлы(УникальныйИдентификатор);
			Кэш.Add(УИ, Ссылка);
			return Ссылка;
		}
		
		public void СериализацияProtoBuf(Stream Поток)
		{
			Serializer.Serialize(Поток,this);
		}
		
		public string СериализацияJson()
		{
			return this.ToJson();
		}
		
		public string СериализацияXml()
		{
			return this.ToXml();
		}
	}
}